package com.tang.objectOriented.middleRank.encapsulation;

public class Encapsulation01 {
    public static void main(String[] args){
        Person person = new Person();
        person.setName("tt");
        person.setAge(30);
        person.setSalary(30000);
        System.out.println(person.info());
        System.out.println(person.getSalary());
        //如果我们自己使用构造器指定属性
        Person smith = new Person("smith", 80, 50000);
        System.out.println("====smith 的信息======");
        System.out.println(smith.info());
    }
}

/*
那么在 java 中如何实现这种类似的控制呢?
不能随便查看人的年龄,工资等隐私，并对设置的年龄进行合理的验证。
年龄合理就设置，否则给默认 年龄, 必须在 1-120, 年龄， 工资不能直接查看 ，
name 的长度在 2-6 字符 之间
 */
class Person{
    private String name;
    private int age;
    private double salary;


    public Person() {
    }

    public Person(String name, int age, double salary) {
        this.setName(name);
        this.age = age;
        this.salary = salary;
        //我们可以将 set 方法写在构造器中，这样仍然可以验证
        setName(name);
        setAge(age);
        setSalary(salary);
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        //加入对数据的校验,相当于增加了业务逻辑
        if (name.length() >=2 && name.length() <= 6){
            this.name = name;
        }else {
            System.out.println("名字的长度不对，需要(2-6)个字符，默认名字");
            this.name = "无名人";
        }

    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        if (age>=1&& age<=120) {
            this.age = age;
        }else {
            System.out.println("你设置年龄不对，需要在 (1-120), 给默认年龄 18 ");
            this.age = 18;//给一个默认年龄
        }
    }

    public double getSalary() {
        //可以这里增加对当前对象的权限判断
        return salary;
    }

    public void setSalary(double salary) {
        this.salary = salary;
    }

    public String info(){
        return "信息为 name=" + name + " age=" + age + " 薪水=" + salary;
    }
}
